﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Xml.Serialization;

namespace TP2.Lib
{
    
    [Serializable]
    public abstract class VehiculoAereo : ElementoJuego
    {

        #region  /* ------------ Propiedaes --------------*/

        private List<Arma> _armas = new List<Arma>();
        public List<Arma> Armas
        {
            get {return this._armas;}
            set {this._armas = value;}
        }

        private bool _esGuia;
        public bool EsGuia
        {
            get { return this._esGuia; }
            set { this._esGuia = value; }
        }

        private Flota _flota;
        public Flota FlotaALaQuePertenece
        {
            get { return this._flota; }
            set { this._flota = value; }
        }

        private int _vidaMaxima;
        public int VidaMaxima
        {
            get {return this._vidaMaxima;}
            set {this._vidaMaxima = value;}
        }

        private int _puntosPorDestruccion;
        public int PuntosPorDestruccion
        {
            get {return this._puntosPorDestruccion;}
            set {this._puntosPorDestruccion = value;}
        }

        private int _variableDisparo;
        public int VariableDisparo
        {
            get { return this._variableDisparo; }
            set { this._variableDisparo = value; }
        }

        #endregion

        public VehiculoAereo(){} /*Constructor vacio, utilizado solo para serializar*/
        
        public VehiculoAereo(double[] posicion, int[] dimensiones) : base(posicion, dimensiones) 
        {
            //this.Armas = new List<Arma>();
        }
        
        public void AgregarArma(Arma arma)
        {
            this.Armas.Add(arma);
        }

        public double[] BuscarDistanciaMinimaContrario(List<ElementoJuego> listaDeVehiculos)
        {
            //Lo utiliza el AvionJugador y el Bombardero para obtener la posicion del contrario mas cercana que va a utilizar el TorpedoRastreador.
            double minimaDistancia;
            double distancia;
            double[] posicionContrario = new double[3];

            //Seteo inicial de Minima distancia como la Maxima posible.
            minimaDistancia = Math.Sqrt(Math.Pow((this.Dimensiones[0]), 2) + Math.Pow((this.Dimensiones[1]), 2));

            if (listaDeVehiculos.Count != 0)
            {

                foreach (VehiculoAereo vehiculo in listaDeVehiculos)
                {
                    distancia = this.CalcularDistanciaEntreElementos(vehiculo);
                    if ((distancia > 0) && (distancia < minimaDistancia))
                    {
                        minimaDistancia = distancia;
                        posicionContrario = vehiculo.Posicion;
                    }
                }
                return (posicionContrario);
            }
            else
            {
                //mando el proyectil al Medio
                posicionContrario[0] = this.Dimensiones[0] / 2;
                posicionContrario[1] = this.Dimensiones[1] / 2;
                posicionContrario[2] = this.Dimensiones[2] / 2;
                return (posicionContrario);
            }
            
        }

        public override bool ImpactarConProyectil(Proyectil impactante)
        {
            int temp; bool vivo;

            temp = impactante.Danio;
            this.ModificarVida(temp);
            vivo = this.EstoyVivo();
            return (vivo);
        }

        public override void ImpactarConAvionJugador()
        {
            this.ModificarVida(this.Vida);
        }

        /*Metodo que devuelve el elemento de bonus que deja un avion contrario al ser destruido*/
        public virtual ElementoJuego MeMori()
        {
            return (null);
        }

        public virtual void SetearPosicionContrarioCercana(List<ElementoJuego> listaVehiculos)
        {

        }

        #region ------ metodos abstractos ------

        public abstract void AgregateALista(List<ElementoJuego> lista1, List<ElementoJuego> lista2);

        #endregion
        
    }
}
